home *** CD-ROM | disk | FTP | other *** search
/ Nothing but Tetris / Nothing but Tetris.iso / amiga / shapes / autoexec.amos / autoexec.amosSourceCode next >
AMOS Source Code  |  1991-05-17  |  26KB  |  885 lines

  1. Dim HIGH_NAME$(10),HIGH_SCORE(10),SHAPES(7)
  2. Global HIGH_NAME$(),HIGH_SCORE(),SHAPES()
  3. Global LEVEL,SCORE,LEVEL_TIME,SPACES,PATH$,SHAPE,ROTATION,OUT_OF_TIME
  4. Global GAME_OVER,PLACE_MODE,OK,P1,P2,P3,P4,P5,P6,P7,P8,P9,CODE$,M_FLAG,C_FLAG
  5. Break Off : PATH$="SYS:"
  6. '
  7. '
  8. A_INITIALISATION
  9. B_MAIN_PROGRAM
  10. '
  11. '
  12. Procedure A_INITIALISATION
  13.    CODE$="SHAPE"
  14.    C_FLAG=False
  15.    AA_READ_HIGH_SCORES
  16.    AB_LOAD_AND_PACK_TITLE_SCREEN
  17.    AC_LOAD_BOB_DATA
  18.    AD_LOAD_MUSIC
  19.    AE_LOAD_SAMPLES
  20. End Proc
  21. Procedure AA_READ_HIGH_SCORES
  22.    If Exist(PATH$+"scores")
  23.       Open In 1,PATH$+"scores"
  24.       For I=1 To 10
  25.          Input #1,HIGH_NAME$(I),S$
  26.          HIGH_SCORE(I)=Val(S$)
  27.       Next I
  28.       Close 1
  29.    Else 
  30.       Restore HIGH_SCORE_DEFAULTS
  31.       For I=1 To 10
  32.          Read HIGH_NAME$(I),HIGH_SCORE(I)
  33.       Next I
  34.    End If 
  35.    HIGH_SCORE_DEFAULTS:
  36.    Data "BEATMASTER",500
  37.    Data "BEATMASTER",450
  38.    Data "BEATMASTER",400
  39.    Data "BEATMASTER",350
  40.    Data "BEATMASTER",300
  41.    Data "BEATMASTER",250
  42.    Data "BEATMASTER",200
  43.    Data "BEATMASTER",150
  44.    Data "BEATMASTER",100
  45.    Data "BEATMASTER",50
  46. End Proc
  47. Procedure AB_LOAD_AND_PACK_TITLE_SCREEN
  48.    Load Iff PATH$+"title.iff",0
  49.    Screen Hide 0
  50.    Curs Off : Flash Off : Hide 
  51.    Pack 0 To 6
  52. End Proc
  53. Procedure AC_LOAD_BOB_DATA
  54.    Load PATH$+"Bobs.ABK"
  55. End Proc
  56. Procedure AD_LOAD_MUSIC
  57.   Load PATH$+"music.abk"
  58.   Music 1
  59.   Tempo 17
  60.   M_FLAG=True
  61. End Proc
  62. Procedure AE_LOAD_SAMPLES
  63.   Load PATH$+"samples.abk"
  64. End Proc
  65. Procedure B_MAIN_PROGRAM
  66.    Repeat 
  67.       XA_RESTORE_SCREEN
  68.       Pen 24
  69.       Paper 0
  70.       Print At(11,8);"F1 : PLAY GAME"
  71.       Print At(11,10);"F2 : HIGH SCORES"
  72.       Print At(11,12);"F3 : INSTRUCTIONS"
  73.       Pen 21
  74.       Print At(11,16);"   CODE: ";CODE$
  75.       Pen 9
  76.       Print At(11,24);" WRITTEN IN AMOS "
  77.       If C_FLAG
  78.         Pen 12
  79.         Print At(11,22);"  CHEAT MODE ON  "
  80.       End If 
  81.       XD_DISPLAY_LEVEL
  82.       XF_DISPLAY_SCORE
  83.       XB_FADE_IN_PALETTE
  84.       Repeat 
  85.          Repeat 
  86.             K$=Inkey$
  87.          Until K$<>""
  88.          K$=Upper$(K$)
  89.          If(K$>="A") and(K$<="Z")
  90.            CODE$=Right$(CODE$,4)+K$
  91.            Pen 21
  92.            Print At(20,16);CODE$
  93.            If CODE$="PENIS"
  94.              C_FLAG=True
  95.            End If 
  96.            If CODE$="FANNY"
  97.              C_FLAG=False
  98.            End If 
  99.          End If 
  100.          If C_FLAG
  101.            Pen 12
  102.            Print At(11,22);"  CHEAT MODE ON  "
  103.          Else 
  104.            Print At(11,22);"                 "
  105.          End If 
  106.          S=Scancode
  107.          If S=80 Then BA_PLAY_GAME
  108.          If S=81 Then BB_HIGH_SCORES
  109.          If S=82 Then BC_INSTRUCTIONS
  110.       Until S=80 or S=81 or S=82
  111.       Repeat 
  112.       Until Inkey$=""
  113.    Until False
  114. End Proc
  115. Procedure BA_PLAY_GAME
  116.    XA_RESTORE_SCREEN
  117.    BAA_INITIALISE_GAME
  118.    Repeat 
  119.       BAB_INITIALISE_LEVEL
  120.       XB_FADE_IN_PALETTE
  121.       Limit Mouse X Hard(84),Y Hard(61) To X Hard(219),Y Hard(196)
  122.       Timer=0
  123.       BAC_PLAY_LEVEL
  124.       If Not GAME_OVER Then BAE_LEVEL_COMPLETE
  125.    Until GAME_OVER
  126.    If OUT_OF_TIME Then BAD_OUT_OF_TIME
  127.    If SCORE>HIGH_SCORE(10) Then BAF_HIGH_SCORE
  128. End Proc
  129. Procedure BAA_INITIALISE_GAME
  130.    GAME_OVER=False
  131.    SCORE=0
  132.    LEVEL=1
  133.    XH_LEVEL_CODES["CHECK"]
  134. End Proc
  135. Procedure BAB_INITIALISE_LEVEL
  136.    SPACES=0
  137.    SHAPE=1
  138.    ROTATION=1
  139.    PLACE_MODE=True
  140.    OUT_OF_TIME=False
  141.    Open Random 1,PATH$+"level-data"
  142.    Field 1,333 As L$
  143.    Get 1,LEVEL
  144.    Ink 0
  145.    Bob Off 1
  146.    Wait Vbl 
  147.    Bar 84,61 To 227,204
  148.    LEVEL_TIME=Asc(Left$(L$,1))*256+Asc(Mid$(L$,2,1))
  149.    Ink 0,30
  150.    For I=1 To 7
  151.       SHAPES(I)=Asc(Mid$(L$,2+I,1))
  152.       Text 16+33*I,250,Right$("0"+Str$(SHAPES(I))-" ",2)
  153.    Next I
  154.    Ink 6
  155.    For I=1 To 18
  156.       For J=1 To 18
  157.          X$=Mid$(L$,9+(I-1)*18+J,1)
  158.          If X$="X" Then Bar 76+J*8,53+I*8 To 83+J*8,60+I*8
  159.          If X$=" " Then Inc SPACES
  160.       Next J
  161.    Next I
  162.    Ink 21,5
  163.    XC_DISPLAY_TIME[LEVEL_TIME]
  164.    XD_DISPLAY_LEVEL
  165.    XE_DISPLAY_SPACES
  166.    Close 1
  167. End Proc
  168. Procedure BAC_PLAY_LEVEL
  169.    FINISH=False
  170.    Repeat 
  171.       X=X Screen(X Mouse)
  172.       Y=Y Screen(Y Mouse)
  173.       M=Mouse Click
  174.       K$=Inkey$
  175.       If PLACE_MODE
  176.          Bob 1,Int(X/8)*8-4,Int(Y/8)*8-3,SHAPE*8+4+ROTATION
  177.          If M and 1
  178.             BACD_PUT_DOWN_PIECE[X,Y]
  179.          End If 
  180.          If M and 2
  181.             Add ROTATION,1,1 To 4
  182.          End If 
  183.       Else 
  184.          Bob 1,Int(X/8)*8+7,Int(Y/8)*8+8,58
  185.          If M and 1
  186.             BACE_PICK_UP_PIECE[Int(X/8)*8+7,Int(Y/8)*8+8]
  187.          End If 
  188.       End If 
  189.       If(M and 4) or(K$=" ") Then BACA_FLIP_MODE
  190.       If(K$="m") or(K$="M")
  191.         If M_FLAG
  192.           Music Off 
  193.           M_FLAG=False
  194.         Else 
  195.           Music 1 : Tempo 17
  196.           M_FLAG=True
  197.         End If 
  198.       End If 
  199.       If K$=Chr$(27) Then GAME_OVER=True
  200.       XC_DISPLAY_TIME[LEVEL_TIME-Timer/50]
  201.       BACB_CHECK_FUNC_KEYS
  202.       BACC_CHECK_TIMER
  203.       If((K$="n") or(K$="N")) and C_FLAG Then SPACES=0
  204.       If SPACES=0 Then FINISH=True : LEVEL_TIME=LEVEL_TIME-Timer/50
  205.    Until FINISH or GAME_OVER
  206. End Proc
  207. Procedure BACA_FLIP_MODE
  208.    If PLACE_MODE
  209.       PLACE_MODE=False
  210.       Ink 21,5
  211.       Text 22,201,"ERASE"
  212.    Else 
  213.       PLACE_MODE=True
  214.       Ink 21,5
  215.       Text 22,201,"PLACE"
  216.    End If 
  217. End Proc
  218. Procedure BACB_CHECK_FUNC_KEYS
  219.    If Key State(80) Then SHAPE=0
  220.    If Key State(81) Then SHAPE=1
  221.    If Key State(82) Then SHAPE=2
  222.    If Key State(83) Then SHAPE=3
  223.    If Key State(84) Then SHAPE=4
  224.    If Key State(85) Then SHAPE=5
  225.    If Key State(86) Then SHAPE=6
  226. End Proc
  227. Procedure BACC_CHECK_TIMER
  228.    If Timer/50>LEVEL_TIME
  229.       GAME_OVER=True
  230.       OUT_OF_TIME=True
  231.    End If 
  232. End Proc
  233. Procedure BACD_PUT_DOWN_PIECE[X,Y]
  234.    Bob Off 1
  235.    OK=True
  236.    X=Int(X/8)*8-4
  237.    Y=Int(Y/8)*8-3
  238.    P1=(Point(X+3,Y+3)<>0)
  239.    P2=(Point(X+11,Y+3)<>0)
  240.    P3=(Point(X+19,Y+3)<>0)
  241.    P4=(Point(X+3,Y+11)<>0)
  242.    P5=(Point(X+11,Y+11)<>0)
  243.    P6=(Point(X+19,Y+11)<>0)
  244.    P7=(Point(X+3,Y+19)<>0)
  245.    P8=(Point(X+11,Y+19)<>0)
  246.    P9=(Point(X+19,Y+19)<>0)
  247.    If SHAPE=0 Then BACDA_CHECK_SHAPE_0
  248.    If SHAPE=1 Then BACDB_CHECK_SHAPE_1
  249.    If SHAPE=2 Then BACDC_CHECK_SHAPE_2
  250.    If SHAPE=3 Then BACDD_CHECK_SHAPE_3
  251.    If SHAPE=4 Then BACDE_CHECK_SHAPE_4
  252.    If SHAPE=5 Then BACDF_CHECK_SHAPE_5
  253.    If SHAPE=6 Then BACDG_CHECK_SHAPE_6
  254.    If SHAPES(SHAPE+1)=0 Then OK=False : Sample 3 To 4 : Play 4,40,16 : Play 4,37,1
  255.    If OK Then BACDH_PASTE_SHAPE[X,Y]
  256. End Proc
  257. Procedure BACDA_CHECK_SHAPE_0
  258.    If P2 or P4 or P5 or P6 or P8
  259.       OK=False
  260.    End If 
  261. End Proc
  262. Procedure BACDB_CHECK_SHAPE_1
  263.    If ROTATION=1 and(P2 or P4 or P5 or P7)
  264.       OK=False
  265.    End If 
  266.    If ROTATION=2 and(P1 or P2 or P5 or P6)
  267.       OK=False
  268.    End If 
  269.    If ROTATION=3 and(P3 or P5 or P6 or P8)
  270.       OK=False
  271.    End If 
  272.    If ROTATION=4 and(P4 or P5 or P8 or P9)
  273.       OK=False
  274.    End If 
  275. End Proc
  276. Procedure BACDC_CHECK_SHAPE_2
  277.    If ROTATION=1 and(P2 or P5 or P8 or P9)
  278.       OK=False
  279.    End If 
  280.    If ROTATION=2 and(P4 or P5 or P6 or P7)
  281.       OK=False
  282.    End If 
  283.    If ROTATION=3 and(P1 or P2 or P5 or P8)
  284.       OK=False
  285.    End If 
  286.    If ROTATION=4 and(P3 or P4 or P5 or P6)
  287.       OK=False
  288.    End If 
  289. End Proc
  290. Procedure BACDD_CHECK_SHAPE_3
  291.    If ROTATION=1 and(P2 or P4 or P5 or P8)
  292.       OK=False
  293.    End If 
  294.    If ROTATION=2 and(P2 or P4 or P5 or P6)
  295.       OK=False
  296.    End If 
  297.    If ROTATION=3 and(P2 or P5 or P6 or P8)
  298.       OK=False
  299.    End If 
  300.    If ROTATION=4 and(P4 or P5 or P6 or P8)
  301.       OK=False
  302.    End If 
  303. End Proc
  304. Procedure BACDE_CHECK_SHAPE_4
  305.    If ROTATION=1 and(P1 or P4 or P5 or P7 or P8)
  306.       OK=False
  307.    End If 
  308.    If ROTATION=2 and(P1 or P2 or P3 or P4 or P5)
  309.       OK=False
  310.    End If 
  311.    If ROTATION=3 and(P2 or P3 or P5 or P6 or P9)
  312.       OK=False
  313.    End If 
  314.    If ROTATION=4 and(P5 or P6 or P7 or P8 or P9)
  315.       OK=False
  316.    End If 
  317. End Proc
  318. Procedure BACDF_CHECK_SHAPE_5
  319.    If ROTATION=1 and(P2 or P3 or P5 or P8 or P9)
  320.       OK=False
  321.    End If 
  322.    If ROTATION=2 and(P4 or P5 or P6 or P7 or P9)
  323.       OK=False
  324.    End If 
  325.    If ROTATION=3 and(P1 or P2 or P5 or P7 or P8)
  326.       OK=False
  327.    End If 
  328.    If ROTATION=4 and(P1 or P3 or P4 or P5 or P6)
  329.       OK=False
  330.    End If 
  331. End Proc
  332. Procedure BACDG_CHECK_SHAPE_6
  333.    If(ROTATION=1 or ROTATION=3) and(P1 or P2 or P5 or P8 or P9)
  334.       OK=False
  335.    End If 
  336.    If(ROTATION=2 or ROTATION=4) and(P3 or P4 or P5 or P6 or P7)
  337.       OK=False
  338.    End If 
  339. End Proc
  340. Procedure BACDH_PASTE_SHAPE[X,Y]
  341.    Bob Off 1
  342.    Wait Vbl 
  343.    Paste Bob X,Y,SHAPE*8+ROTATION
  344.    GX=(X-84)/8+1
  345.    GY=(X-61)/8+1
  346.    If SHAPE=0 Then SPACES=SPACES-5 : SCORE=SCORE+5
  347.    If SHAPE=1 Then SPACES=SPACES-4 : SCORE=SCORE+4
  348.    If SHAPE=2 Then SPACES=SPACES-4 : SCORE=SCORE+4
  349.    If SHAPE=3 Then SPACES=SPACES-4 : SCORE=SCORE+4
  350.    If SHAPE=4 Then SPACES=SPACES-5 : SCORE=SCORE+5
  351.    If SHAPE=5 Then SPACES=SPACES-5 : SCORE=SCORE+5
  352.    If SHAPE=6 Then SPACES=SPACES-5 : SCORE=SCORE+5
  353.    Dec SHAPES(SHAPE+1)
  354.    XE_DISPLAY_SPACES
  355.    XF_DISPLAY_SCORE
  356.    XG_DISPLAY_SHAPE_COUNTS
  357. End Proc
  358. Procedure BACE_PICK_UP_PIECE[X,Y]
  359.    Bob Off 1
  360.    Wait Vbl 
  361.    P=Point(X,Y)
  362.    If P=9 Then BACEA_PICK_SHAPE_0[X,Y]
  363.    If P=24 Then BACEB_PICK_SHAPE_1[X,Y]
  364.    If P=21 Then BACEC_PICK_SHAPE_2[X,Y]
  365.    If P=15 Then BACED_PICK_SHAPE_3[X,Y]
  366.    If P=18 Then BACEE_PICK_SHAPE_4[X,Y]
  367.    If P=27 Then BACEF_PICK_SHAPE_5[X,Y]
  368.    If P=12 Then BACEG_PICK_SHAPE_6[X,Y]
  369.    XE_DISPLAY_SPACES
  370.    XF_DISPLAY_SCORE
  371.    XG_DISPLAY_SHAPE_COUNTS
  372. End Proc
  373. Procedure BACEA_PICK_SHAPE_0[X,Y]
  374.    If Point(X-3,Y)=9 and Point(X+4,Y)<>9 Then X=X-8
  375.    If Point(X+4,Y)=9 and Point(X-3,Y)<>9 Then X=X+8
  376.    If Point(X,Y-3)=9 and Point(X,Y+4)<>9 Then Y=Y-8
  377.    If Point(X,Y+4)=9 and Point(X,Y-3)<>9 Then Y=Y+8
  378.    X=X-11
  379.    Y=Y-11
  380.    Ink 0
  381.    Bar X+8,Y To X+15,Y+23
  382.    Bar X,Y+8 To X+23,Y+15
  383.    SPACES=SPACES+5
  384.    SCORE=SCORE-5
  385.    Inc SHAPES(1)
  386. End Proc
  387. Procedure BACEB_PICK_SHAPE_1[X,Y]
  388.    P1=(Point(X-3,Y)=24) : N1=(Point(X-3,Y)<>24)
  389.    P2=(Point(X,Y-3)=24) : N2=(Point(X,Y-3)<>24)
  390.    P3=(Point(X+4,Y)=24) : N3=(Point(X+4,Y)<>24)
  391.    P4=(Point(X,Y+4)=24) : N4=(Point(X,Y+4)<>24)
  392.    If N1 and N2 and N3 and P4 Then R=1 : Y=Y+8
  393.    If P1 and P2 and N3 and N4 Then R=1
  394.    If N1 and N2 and P3 and P4 Then R=1 : X=X+8
  395.    If N1 and P2 and N3 and N4 Then R=1 : X=X+8 : Y=Y-8
  396.    If N1 and N2 and P3 and N4 Then R=2 : X=X+8 : Y=Y+8
  397.    If P1 and N2 and N3 and P4 Then R=2 : Y=Y+8
  398.    If N1 and P2 and P3 and N4 Then R=2
  399.    If P1 and N2 and N3 and N4 Then R=2 : X=X-8
  400.    X=X-11 : Y=Y-11
  401.    Ink 0
  402.    If R=1
  403.       Bar X+8,Y To X+15,Y+15
  404.       Bar X,Y+8 To X+7,Y+23
  405.    End If 
  406.    If R=2
  407.       Bar X,Y To X+15,Y+7
  408.       Bar X+8,Y+8 To X+23,Y+15
  409.    End If 
  410.    SPACES=SPACES+4
  411.    SCORE=SCORE-4
  412.    Inc SHAPES(2)
  413. End Proc
  414. Procedure BACEC_PICK_SHAPE_2[X,Y]
  415.    BACEC_RECHECK:
  416.    P1=(Point(X-3,Y)=21) : N1=(Point(X-3,Y)<>21)
  417.    P2=(Point(X,Y-3)=21) : N2=(Point(X,Y-3)<>21)
  418.    P3=(Point(X+4,Y)=21) : N3=(Point(X+4,Y)<>21)
  419.    P4=(Point(X,Y+4)=21) : N4=(Point(X,Y+4)<>21)
  420.    P5=(Point(X-11,Y+3)=21) : N5=(Point(X-11,Y+3)<>21)
  421.    P6=(Point(X+3,Y-11)=21) : N6=(Point(X+3,Y-11)<>21)
  422.    P7=(Point(X+12,Y+3)=21) : N7=(Point(X+12,Y+3)<>21)
  423.    P8=(Point(X+3,Y+12)=21) : N8=(Point(X+3,Y+12)<>21)
  424.    If N1 and N2 and N3 and P4 and P8 Then R=1 : Y=Y+8
  425.    If N1 and P2 and N3 and P4 Then Y=Y-8 : Goto BACEC_RECHECK
  426.    If N1 and P2 and P3 and N4 Then R=1 : Y=Y-8
  427.    If P1 and N2 and N3 and N4 and N5 Then R=1 : Y=Y-8 : X=X-8
  428.    If N1 and N2 and P3 and P4 Then R=2 : X=X+8
  429.    If P1 and N2 and P3 and N4 Then X=X-8 : Goto BACEC_RECHECK
  430.    If P1 and N2 and N3 and N4 and P5 Then R=2 : X=X-8
  431.    If N1 and P2 and N3 and N4 and N6 Then R=2 : X=X+8 : Y=Y-8
  432.    If N1 and N2 and P3 and N4 and N7 Then R=3 : X=X+8 : Y=Y+8
  433.    If P1 and N2 and N3 and P4 Then R=3 : Y=Y+8
  434.    If N1 and P2 and N3 and N4 and P6 Then R=3 : Y=Y-8
  435.    If N1 and N2 and N3 and P4 and N8 Then R=4 : Y=Y+8 : X=X-8
  436.    If N1 and N2 and P3 and N4 and P7 Then R=4 : X=X+8
  437.    If P1 and P2 and N3 and N4 Then R=4 : X=X-8
  438.    X=X-11 : Y=Y-11
  439.    Ink 0
  440.    If R=1
  441.       Bar X+8,Y To X+15,Y+23
  442.       Bar X+16,Y+16 To X+23,Y+23
  443.    End If 
  444.    If R=2
  445.       Bar X,Y+8 To X+23,Y+15
  446.       Bar X,Y+16 To X+7,Y+23
  447.    End If 
  448.    If R=3
  449.       Bar X,Y To X+15,Y+7
  450.       Bar X+8,Y To X+15,Y+23
  451.    End If 
  452.    If R=4
  453.       Bar X+16,Y To X+23,Y+7
  454.       Bar X,Y+8 To X+23,Y+15
  455.    End If 
  456.    SPACES=SPACES+4
  457.    SCORE=SCORE-4
  458.    Inc SHAPES(3)
  459. End Proc
  460. Procedure BACED_PICK_SHAPE_3[X,Y]
  461.    BACED_RECHECK:
  462.    P1=(Point(X-3,Y)=15) : N1=(Point(X-3,Y)<>15)
  463.    P2=(Point(X,Y-3)=15) : N2=(Point(X,Y-3)<>15)
  464.    P3=(Point(X+4,Y)=15) : N3=(Point(X+4,Y)<>15)
  465.    P4=(Point(X,Y+4)=15) : N4=(Point(X,Y+4)<>15)
  466.    If N1 and N2 and N3 and P4 Then Y=Y+8 : Goto BACED_RECHECK
  467.    If N1 and N2 and P3 and N4 Then X=X+8 : Goto BACED_RECHECK
  468.    If P1 and N2 and N3 and N4 Then X=X-8 : Goto BACED_RECHECK
  469.    If N1 and P2 and N3 and N4 Then Y=Y-8 : Goto BACED_RECHECK
  470.    If P1 and P2 and N3 and P4 Then R=1
  471.    If P1 and P2 and P3 and N4 Then R=2
  472.    If N1 and P2 and P3 and P4 Then R=3
  473.    If P1 and N2 and P3 and P4 Then R=4
  474.    Ink 0
  475.    X=X-11 : Y=Y-11
  476.    Bar X+8,Y+8 To X+15,Y+15
  477.    If R=1 or R=2 or R=4 Then Bar X,Y+8 To X+7,Y+15
  478.    If R=1 or R=2 or R=3 Then Bar X+8,Y To X+15,Y+8
  479.    If R=2 or R=3 or R=4 Then Bar X+16,Y+8 To X+23,Y+15
  480.    If R=1 or R=3 or R=4 Then Bar X+8,Y+16 To X+15,Y+23
  481.    SPACES=SPACES+4
  482.    SCORE=SCORE-4
  483.    Inc SHAPES(4)
  484. End Proc
  485. Procedure BACEE_PICK_SHAPE_4[X,Y]
  486.    BACEE_RECHECK:
  487.    P1=(Point(X-3,Y)=18) : N1=(Point(X-3,Y)<>18)
  488.    P2=(Point(X,Y-3)=18) : N2=(Point(X,Y-3)<>18)
  489.    P3=(Point(X+4,Y)=18) : N3=(Point(X+4,Y)<>18)
  490.    P4=(Point(X,Y+4)=18) : N4=(Point(X,Y+4)<>18)
  491.    If N1 and N2 and P3 and P4 Then X=X+8 : Goto BACEE_RECHECK
  492.    If P1 and N2 and N3 and P4 Then Y=Y+8 : Goto BACEE_RECHECK
  493.    If P1 and P2 and N3 and N4 Then X=X-8 : Goto BACEE_RECHECK
  494.    If N1 and P2 and P3 and N4 Then Y=Y-8 : Goto BACEE_RECHECK
  495.    If N1 and N2 and N3 and P4 Then R=1 : X=X+8 : Y=Y+8
  496.    If P1 and N2 and N3 and N4 Then R=2 : X=X-8 : Y=Y+8
  497.    If N1 and P2 and N3 and N4 Then R=3 : X=X-8 : Y=Y-8
  498.    If N1 and N2 and P3 and N4 Then R=4 : X=X+8 : Y=Y-8
  499.    If N1 and P2 and P3 and P4 Then R=1 : X=X+8
  500.    If P1 and N2 and P3 and P4 Then R=2 : Y=Y+8
  501.    If P1 and P2 and N3 and P4 Then R=3 : X=X-8
  502.    If P1 and P2 and P3 and N4 Then R=4 : Y=Y-8
  503.    X=X-11 : Y=Y-11
  504.    Ink 0
  505.    If R=1
  506.       Bar X,Y To X+7,Y+7
  507.       Bar X,Y+8 To X+15,Y+23
  508.    End If 
  509.    If R=2
  510.       Bar X,Y To X+15,Y+15
  511.       Bar X+16,Y To X+23,Y+7
  512.    End If 
  513.    If R=3
  514.       Bar X+8,Y To X+23,Y+15
  515.       Bar X+16,Y+16 To X+23,Y+23
  516.    End If 
  517.    If R=4
  518.       Bar X,Y+16 To X+7,Y+23
  519.       Bar X+8,Y+8 To X+23,Y+23
  520.    End If 
  521.    SPACES=SPACES+5
  522.    SCORE=SCORE-5
  523.    Inc SHAPES(5)
  524. End Proc
  525. Procedure BACEF_PICK_SHAPE_5[X,Y]
  526. BACEF_RECHECK:
  527.   P1=(Point(X-3,Y)=27) : N1=(Point(X-3,Y)<>27)
  528.   P2=(Point(X,Y-3)=27) : N2=(Point(X,Y-3)<>27)
  529.   P3=(Point(X+4,Y)=27) : N3=(Point(X+4,Y)<>27)
  530.   P4=(Point(X,Y+4)=27) : N4=(Point(X,Y+4)<>27)
  531.   XX=X : YY=Y
  532.   If N1 and N2 and P3 and P4 and Point(XX,YY+12)=27 Then R=1 : Y=Y+8
  533.   If N1 and P2 and N3 and P4 and Point(XX-3,YY+8)<>27 Then R=1
  534.   If N1 and P2 and P3 and N4 and Point(XX,YY-11)=27 Then R=1 : Y=Y-8
  535.   If P1 and N2 and N3 and N4 and Point(XX-8,YY-3)<>27 Then R=1 : X=X-8 : Y=Y+8
  536.   If P1 and N2 and N3 and N4 and Point(XX-8,YY-3)=27 Then R=1 : X=X-8 : Y=Y-8
  537.   If N1 and N2 and P3 and P4 and Point(XX,YY+12)<>27 Then R=2 : X=X+8
  538.   If P1 and N2 and P3 and N4 and Point(XX+8,YY-3)<>27 Then R=2
  539.   If P1 and N2 and N3 and P4 and Point(XX-11,YY)=27 Then R=2 : X=X-8
  540.   If N1 and P2 and N3 and N4 and Point(XX-3,YY-8)<>27 Then R=2 : X=X+8 : Y=Y-8
  541.   If N1 and P2 and N3 and N4 and Point(XX-3,YY-8)=27 Then R=2 : X=X-8 : Y=Y-8
  542.   If N1 and N2 and P3 and N4 and Point(XX+8,YY-3)<>27 Then R=3 : X=X+8 : Y=Y+8
  543.   If N1 and N2 and P3 and N4 and Point(XX+8,YY-3)=27 Then R=3 : X=X+8 : Y=Y-8
  544.   If P1 and N2 and N3 and P4 and Point(XX,YY+12)=27 Then R=3 : Y=Y+8
  545.   If N1 and P2 and N3 and P4 and Point(XX-3,YY+8)=27 Then R=3
  546.   If P1 and P2 and N3 and N4 and Point(XX-11,YY)<>27 Then R=3 : Y=Y-8
  547.   If N1 and N2 and N3 and P4 and Point(XX+4,YY+8)=27 Then R=4 : X=X+8 : Y=Y+8
  548.   If N1 and N2 and N3 and P4 and Point(XX+4,YY+8)<>27 Then R=4 : X=X-8 : Y=Y+8
  549.   If N1 and P2 and P3 and N4 and Point(XX,YY-11)<>27 Then R=4 : X=X+8
  550.   If P1 and N2 and P3 and N4 and Point(XX+8,YY-3)=27 Then R=4
  551.   If P1 and P2 and N3 and N4 and Point(XX-11,YY)=27 Then R=4 : X=X-8
  552.   X=X-11 : Y=Y-11
  553.   Ink 0
  554.   If R=1 or R=3 Then Bar X+8,Y To X+15,Y+23
  555.   If R=2 or R=4 Then Bar X,Y+8 To X+23,Y+15
  556.   If R=3 or R=4 Then Bar X,Y To X+7,Y+7
  557.   If R=1 or R=4 Then Bar X+16,Y To X+23,Y+7
  558.   If R=1 or R=2 Then Bar X+16,Y+16 To X+23,Y+23
  559.   If R=2 or R=3 Then Bar X,Y+16 To X+7,Y+23
  560.   SPACES=SPACES+5
  561.   SCORE=SCORE-5
  562.   Inc SHAPES(6)
  563. End Proc
  564. Procedure BACEG_PICK_SHAPE_6[X,Y]
  565.   P1=(Point(X-3,Y)=12) : N1=(Point(X-3,Y)<>12)
  566.   P2=(Point(X,Y-3)=12) : N2=(Point(X,Y-3)<>12)
  567.   P3=(Point(X+4,Y)=12) : N3=(Point(X+4,Y)<>12)
  568.   P4=(Point(X,Y+4)=12) : N4=(Point(X,Y+4)<>12)
  569.   If N1 and N2 and P3 and N4 Then R=1 : X=X+8 : Y=Y+8
  570.   If P1 and N2 and N3 and P4 Then R=1 : Y=Y+8
  571.   If N1 and P2 and N3 and P4 Then R=1
  572.   If N1 and P2 and P3 and N4 Then R=1 : Y=Y-8
  573.   If P1 and N2 and N3 and N4 Then R=1 : X=X-8 : Y=Y-8
  574.   If N1 and N2 and N3 and P4 Then R=2 : X=X-8 : Y=Y+8
  575.   If N1 and N2 and P3 and P4 Then R=2 : X=X+8
  576.   If P1 and N2 and P3 and N4 Then R=2
  577.   If P1 and P2 and N3 and N4 Then R=2 : X=X-8
  578.   If N1 and P2 and N3 and N4 Then R=2 : X=X+8 : Y=Y-8
  579.   X=X-11 : Y=Y-11
  580.   Ink 0
  581.   Bar X+8,Y+8 To X+15,Y+15
  582.   If R=1
  583.     Bar X,Y To X+15,Y+7
  584.     Bar X+8,Y+16 To X+23,Y+23
  585.   End If 
  586.   If R=2
  587.     Bar X,Y+8 To X+7,Y+23
  588.     Bar X+16,Y To X+23,Y+15
  589.   End If 
  590.   SPACES=SPACES+5
  591.   SCORE=SCORE-5
  592.   Inc SHAPES(7)
  593. End Proc
  594. Procedure BAD_OUT_OF_TIME
  595.    Ink 8
  596.    Bar 105,124 To 206,139
  597.    Pen 31 : Paper 8
  598.    Print At(14,16);"OUT OF TIME"
  599.    Ink 10
  600.    Box 105,124 To 206,139
  601.    Box 107,126 To 204,137
  602.    Sample 1 To 4
  603.    Play 4,40,50
  604.    XH_WAIT
  605. End Proc
  606. Procedure BAE_LEVEL_COMPLETE
  607.    If M_FLAG Then Mvolume 0
  608.    Sample 2 To 4
  609.    Play 4,40,63
  610.    If M_FLAG Then Mvolume 63
  611.    For I=LEVEL_TIME To 0 Step -1
  612.       Inc SCORE
  613.       Wait Vbl 
  614.       Wait Vbl 
  615.       Wait Vbl 
  616.       XC_DISPLAY_TIME[I]
  617.       XF_DISPLAY_SCORE
  618.    Next I
  619.    LEVEL=LEVEL+1
  620.    If LEVEL<=50
  621.       Ink 0
  622.       Bar 84,61 To 227,204
  623.       Pen 21
  624.       Print At(12,12);"LEVEL COMPLETE!"
  625.       Print At(11,16);"CODE FOR LEVEL";Str$(LEVEL)
  626.       Pen 24
  627.       XH_LEVEL_CODES["SET"]
  628.       Print At(17,18);CODE$
  629.       XH_WAIT
  630.       Fade 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  631.    Else 
  632.       GAME_OVER=True
  633.       BAEE_ADD_LEVEL_BONUS
  634.    End If 
  635. End Proc
  636. Procedure BAEE_ADD_LEVEL_BONUS
  637.   Ink 0
  638.   Bar 84,61 To 227,204
  639.   Pen 21
  640.   Print At(11,12);"CONGRATULATIONS!!"
  641.   Print At(11,14);"YOU HAVE FINISHED"
  642.   Print At(11,16);"   THE GAME!!!   "
  643.   XH_WAIT
  644. End Proc
  645. Procedure BAF_HIGH_SCORE
  646.    XA_RESTORE_SCREEN
  647.    XD_DISPLAY_LEVEL
  648.    XF_DISPLAY_SCORE
  649.    P=10
  650.    For I=10 To 1 Step -1
  651.      If SCORE>HIGH_SCORE(I) Then P=I
  652.    Next I
  653.    For I=10 To P+1 Step -1
  654.      HIGH_NAME$(I)=HIGH_NAME$(I-1)
  655.      HIGH_SCORE(I)=HIGH_SCORE(I-1)
  656.    Next I
  657.    HIGH_SCORE(P)=SCORE
  658.    HIGH_NAME$(P)="??????????"
  659.    Paper 0
  660.    For I=1 To 10
  661.       If I=P Then Pen 27 Else Pen 21
  662.       Print At(11,9+I);HIGH_NAME$(I);" ";Right$(("00000"+(Str$(HIGH_SCORE(I))-" ")),5);
  663.    Next I
  664.    Pen 18
  665.    Print At(11,8);"   HIGH SCORES   "
  666.    Pen 12
  667.    Print At(11,21);"   WELL DONE!!   "
  668.    Print At(11,22);" ENTER YOUR NAME "
  669.    Print At(11,24);"  [          ]"
  670.    XB_FADE_IN_PALETTE
  671.    N$=""
  672.    Pen 24
  673.    Repeat 
  674.      Print At(14,24);Left$(N$+"          ",10)
  675.      K$=Upper$(Inkey$)
  676.      If Instr("ABCDEFGHIJKLMNOPQRSTUVWXYZ !@#$%^&*()-=+.,:;?/`'",K$)
  677.        If Len(N$)<10
  678.          N$=N$+K$
  679.        Else 
  680.          N$=Right$(N$,9)+K$
  681.        End If 
  682.      End If 
  683.    Until K$=Chr$(13)
  684.    HIGH_NAME$(P)=Left$(N$+"          ",10)
  685.    Open Out 1,PATH$+"scores"
  686.    For I=1 To 10
  687.      Print #1,HIGH_NAME$(I)
  688.      Print #1,(Str$(HIGH_SCORE(I))-" ")
  689.    Next I
  690.    Close 1
  691.    BB_HIGH_SCORES
  692. End Proc
  693. Procedure XH_LEVEL_CODES[M$]
  694.    If M$="SET"
  695.      Restore CODES
  696.      For I=1 To LEVEL
  697.        Read CODE$
  698.      Next I
  699.    End If 
  700.    If M$="CHECK"
  701.      Restore CODES
  702.      LEVEL=1
  703.      Read C$
  704.      While(C$<>CODE$) and(C$<>"*")
  705.        Inc LEVEL
  706.        Read C$
  707.      Wend 
  708.      If C$="*"
  709.        LEVEL=1
  710.      End If 
  711.    End If 
  712. CODES: Data "SHAPE","AMIGA","MOUSE","TANGO","CUBIK"
  713.        Data "XENON","QUEEN","APRIL","TASTE","PENNY"
  714.        Data "TRUTH","POWER","TURBO","MUSIC","MATEY"
  715.        Data "SOUND","WORLD","STYLE","VIRUS","PRINT"
  716.        Data "MILKY","KNOCK","BRAIN","GAZZA","ISSUE"
  717.        Data "MATCH","SMURF","PRIZE","TEDDY","GROUP"
  718.        Data "DIANE","SMALL","UNITE","PAINT","VIDEO"
  719.        Data "STILL","INPUT","OFFER","FIRST","ORION"
  720.        Data "PIANO","SHARE","OASIS","KINKY","MORPH"
  721.        Data "NINJA","STONE","GREEN","OZONE","CHIPS"
  722.        Data "*"
  723. End Proc
  724. Procedure BB_HIGH_SCORES
  725.    XA_RESTORE_SCREEN
  726.    Paper 0
  727.    Pen 21
  728.    For I=1 To 10
  729.       Print At(11,9+I);HIGH_NAME$(I);"  ";Right$(("00000"+(Str$(HIGH_SCORE(I))-" ")),5);
  730.    Next I
  731.    Pen 18
  732.    Print At(11,8);"   HIGH SCORES   "
  733.    Pen 12
  734.    Print At(11,23);"PRESS ANY KEY TO"
  735.    Print At(11,24);" RETURN TO MENU "
  736.    XB_FADE_IN_PALETTE
  737.    Repeat : Until Inkey$=""
  738.    Repeat : Until Inkey$<>""
  739. End Proc
  740. Procedure BC_INSTRUCTIONS
  741.   BCA_SCREEN_MASK
  742.   Print At(11,10);"THE OBJECT OF THE"
  743.   Print At(11,11);" GAME IS TO FILL "
  744.   Print At(11,12);"THE BLACK AREA OF"
  745.   Print At(11,13);" THE BOARD USING "
  746.   Print At(11,14);"THE SHAPES AT THE"
  747.   Print At(11,15);"  BOTTOM OF THE  "
  748.   Print At(11,16);"     SCREEN.     "
  749.   Print At(11,18);"HOWEVER, YOU ONLY"
  750.   Print At(11,19);" HAVE SO MANY OF "
  751.   Print At(11,20);"EACH SHAPE TO USE"
  752.   Print At(11,21);" AS INDICATED BY "
  753.   Print At(11,22);" THE VALUE BELOW "
  754.   Print At(11,23);"   THE SHAPES.   "
  755.   XB_FADE_IN_PALETTE
  756.   XH_WAIT
  757.   BCA_SCREEN_MASK
  758.   Print At(11,10);"  TO PUT DOWN A  "
  759.   Print At(11,11);"SHAPE SIMPLY MOVE"
  760.   Print At(11,12);"TO WHERE YOU WANT"
  761.   Print At(11,13);"IT WITH THE MOUSE"
  762.   Print At(11,14);"  AND CLICK THE  "
  763.   Print At(11,15);"LEFT MOUSE BUTTON"
  764.   Print At(11,17);" THE RIGHT MOUSE "
  765.   Print At(11,18);"   BUTTON WILL   "
  766.   Print At(11,19);"ROTATE THE SHAPE."
  767.   Print At(11,21);"TO SELECT ANOTHER"
  768.   Print At(11,22);" SHAPE PRESS THE "
  769.   Print At(11,23);" FUNCTION KEY OF "
  770.   Print At(11,24);" THAT SHAPES NO. "
  771.   XB_FADE_IN_PALETTE
  772.   XH_WAIT
  773.   BCA_SCREEN_MASK
  774.   Print At(11,10);"  PRESSING THE   "
  775.   Print At(11,11);"SPACE BAR (OR THE"
  776.   Print At(11,12);"MIDDLE BUTTON ON "
  777.   Print At(11,13);"SOME MOUSES) WILL"
  778.   Print At(11,14);" TOGGLE YOU INTO "
  779.   Print At(11,15);"   ERASE MODE.   "
  780.   Print At(11,17);"IN THIS MODE JUST"
  781.   Print At(11,18);" CLICK ON ANY OF "
  782.   Print At(11,19);"THE SHAPES ON THE"
  783.   Print At(11,20);"BOARD AND IT WILL"
  784.   Print At(11,21);" BE REMOVED FROM "
  785.   Print At(11,22);"    THE BOARD.   "
  786.   XB_FADE_IN_PALETTE
  787.   XH_WAIT
  788.   BCA_SCREEN_MASK
  789.   Print At(11,10);"WHEN YOU COMPLETE"
  790.   Print At(11,11);"EACH LEVEL A CODE"
  791.   Print At(11,12);"WILL BE GIVEN FOR"
  792.   Print At(11,13);" THE NEXT LEVEL. "
  793.   Print At(11,14);"ENTERING THE CODE"
  794.   Print At(11,15);"  ON THE TITLE-  "
  795.   Print At(11,16);"SCREEN WILL ALLOW"
  796.   Print At(11,17);"YOU TO START THE "
  797.   Print At(11,18);"  GAME AT THAT   "
  798.   Print At(11,19);"      LEVEL.     "
  799.   XB_FADE_IN_PALETTE
  800.   XH_WAIT
  801.   BCA_SCREEN_MASK
  802.   Print At(11,10);"PRESSING `M' WILL"
  803.   Print At(11,11);"TURN THE MUSIC ON"
  804.   Print At(11,12);"     OR OFF."
  805.   Print At(11,14);" `ESC' WILL EXIT "
  806.   Print At(11,15);"THE CURRENT GAME."
  807.   XB_FADE_IN_PALETTE
  808.   XH_WAIT
  809.   BCA_SCREEN_MASK
  810.   Print At(11,10);"THIS GAME IS DISK"
  811.   Print At(11,11);"WARE. DISKWARE IS"
  812.   Print At(11,12);" LIKE SHAREWARE, "
  813.   Print At(11,13);" BUT INSTEAD OF  "
  814.   Print At(11,14);"SENDING MONEY YOU"
  815.   Print At(11,15);"MUST SEND A DISK "
  816.   Print At(11,16);"CONTAINING A P.D."
  817.   Print At(11,17);" PROGRAM TO THE  "
  818.   Print At(11,18);"     AUTHOR.     "
  819.   Print At(11,20);"ALLOWING FOR THE "
  820.   Print At(11,21);"PRICE OF POSTAGE "
  821.   Print At(11,22);" THATS ABOUT 70P "
  822.   Print At(11,23);"FOR A FULL GAME!!"
  823.   XB_FADE_IN_PALETTE
  824.   XH_WAIT
  825.   BCA_SCREEN_MASK
  826.   Print At(11,10);"SEND DONATIONS TO"
  827.   Print At(11,12);"MIKE ARCHER"
  828.   Print At(11,13);"29 HOLBECK AVE"
  829.   Print At(11,14);"MARTON"
  830.   Print At(11,15);"BLACKPOOL"
  831.   Print At(11,16);"FY4 4LS"
  832.   Print At(11,18);" IF I DO NOT GET "
  833.   Print At(11,19);" A GOOD RESPONSE "
  834.   Print At(11,20);"THEN FUTURE GAMES"
  835.   Print At(11,21);"  WILL BE MADE   "
  836.   Print At(11,22);"  LICENSEWARE.   "
  837.   Pen 24
  838.   Print At(11,24);" (SO BE HONEST!) "
  839.   XB_FADE_IN_PALETTE
  840.   XH_WAIT
  841. End Proc
  842. Procedure BCA_SCREEN_MASK
  843.   XA_RESTORE_SCREEN
  844.   Pen 9
  845.   Print At(11,8);"GAME INSTRUCTIONS"
  846.   Pen 21
  847. End Proc
  848. Procedure XA_RESTORE_SCREEN
  849.    Fade 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  850.    Wait 30
  851.    Unpack 6
  852.    Screen Show 0 : Rem  This is just incase screen isn't showing already  
  853. End Proc
  854. Procedure XB_FADE_IN_PALETTE
  855.    Fade 2,$0,$F00,$F77,$FFF,$C6F,$333,$555,$777,$809,$F0F,$F7F,$A,$F,$78F,$B60,$F80,$FA4,$88,$DD,$AFF,$90,$F0,$AFA,$800,$F00,$F77,$870,$CC0,$FF7,$999,$CCC,$FFF
  856.    Wait 30
  857.    Shift Up 5,1,3,1
  858. End Proc
  859. Procedure XC_DISPLAY_TIME[T]
  860.    Ink 21,5 : If T<0 Then T=0
  861.    Text 28,141,Str$(T/60)-" "
  862.    Text 40,141,Right$("00"+Str$(T mod 60)-" ",2)
  863. End Proc
  864. Procedure XD_DISPLAY_LEVEL
  865.    Ink 21,5
  866.    Text 30,111,Right$(("00"+Str$(LEVEL)-" "),3)
  867. End Proc
  868. Procedure XE_DISPLAY_SPACES
  869.    Ink 21,5
  870.    Text 30,171,Right$(("00"+Str$(SPACES)-" "),3)
  871. End Proc
  872. Procedure XF_DISPLAY_SCORE
  873.    Ink 21,5
  874.    Text 21,81,Right$("0000"+Str$(SCORE)-" ",5)
  875. End Proc
  876. Procedure XG_DISPLAY_SHAPE_COUNTS
  877.    Ink 0,30
  878.    For I=1 To 7
  879.       Text 16+33*I,250,Right$("0"+Str$(SHAPES(I))-" ",2)
  880.    Next I
  881. End Proc
  882. Procedure XH_WAIT
  883.   Repeat : Until(Inkey$="") and(Mouse Click=0)
  884.   Repeat : Until(Inkey$<>"") or(Mouse Click<>0)
  885. End Proc